package loggers

import (
	"fmt"
	"github.com/lmittmann/tint"
	"github.com/natefinch/lumberjack"
	slogmulti "github.com/samber/slog-multi"
	"go-record/src/common"
	"log/slog"
	"os"
	"path/filepath"
)

func getJsonFileHandler() slog.Handler {
	logsFile := filepath.Join(common.GetEunPathAbc(), "logs/go-record.log")
	slog.Info("log_init", "logsFile", logsFile)
	_ = os.MkdirAll(filepath.Join("../", logsFile), os.ModePerm)

	lumberjackLog := &lumberjack.Logger{
		Filename:   logsFile, //
		MaxSize:    10,       // 文件最大大小,单位是M
		MaxBackups: 100,      // 最大保留文件数（超过maxAge后最多生成几个文件）
		MaxAge:     365,      // 最大保留时间 1天，单位是天
		LocalTime:  true,     // 是否用本机时间
		Compress:   false,    // 是否压缩归档日志
	}
	handlerOptions := &slog.HandlerOptions{
		AddSource:   true,            // 记录日志位置
		Level:       slog.LevelDebug, // 设置日志级别
		ReplaceAttr: nil,
	}
	newTextHandler := slog.NewJSONHandler(lumberjackLog, handlerOptions)
	return newTextHandler
}

func getTextFileHandler() slog.Handler {
	logsFile := filepath.Join(common.GetEunPathAbc(), "logs/go-record.txt")
	fmt.Println("logsFile", logsFile)
	slog.Info("log_init", "logsFile", logsFile)
	_ = os.MkdirAll(filepath.Join("../", logsFile), os.ModePerm)

	lumberjackLog := &lumberjack.Logger{
		Filename:   logsFile, //
		MaxSize:    10,       // 文件最大大小,单位是M
		MaxBackups: 100,      // 最大保留文件数（超过maxAge后最多生成几个文件）
		MaxAge:     365,      // 最大保留时间 1天，单位是天
		LocalTime:  true,     // 是否用本机时间
		Compress:   false,    // 是否压缩归档日志
	}
	handlerOptions := &slog.HandlerOptions{
		AddSource:   true,            // 记录日志位置
		Level:       slog.LevelDebug, // 设置日志级别
		ReplaceAttr: nil,
	}
	newTextHandler := slog.NewTextHandler(lumberjackLog, handlerOptions)
	return newTextHandler
}

func init() {
	// 控制台美化
	tintHandler := tint.NewHandler(os.Stderr, &tint.Options{
		AddSource:  true,
		Level:      slog.LevelDebug,
		TimeFormat: "2006-01-02 15:04:05.000",
	})

	// Text格式输出到文件
	textFileHandler := getTextFileHandler()
	// Json格式输出到文件
	jsonFileHandler := getJsonFileHandler()

	slogNew := slog.New(slogmulti.Fanout(tintHandler, textFileHandler, jsonFileHandler))

	slog.SetDefault(slogNew)
	slog.Info("log_start", "pid", os.Getpid())
}
